/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.wicket.util.file; import static java.lang.System.currentTimeMillis; import static org.hamcrest.Matchers.lessThan; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.IOException; import java.net.URL; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; /** * Tests for {@link Files} */ public class FilesTest extends Assert { /** * Tests for {@link Files#remove(java.io.File)} * * @throws IOException */ @Test public void remove() throws IOException { assertFalse("'null' files are not deleted.", Files.remove(null)); assertFalse("Non existing files are not deleted.", Files.remove(new File( "/somethingThatDoesntExistsOnMostMachines-111111111111111111111111111111"))); java.io.File file = getFile(); file.createNewFile(); assertTrue("The just created file should exist!", file.isFile()); boolean removed = Files.remove(file); assertFalse("The just removed file should not exist!", file.exists()); assertTrue("Files.remove(file) should remove the file", removed); // try to remove non-existing file removed = Files.remove(file); assertFalse("The just removed file should not exist!", file.exists()); assertFalse("Files.remove(file) should not remove the file", removed); // try to remove a folder java.io.File folder = getFolder(); Files.mkdirs(folder); assertTrue(folder.isDirectory()); assertFalse("Should not be able to delete a folder, even empty one.", Files.remove(folder)); assertTrue("Should not be able to delete a folder.", Files.removeFolder(folder)); } /** * WICKET-6236 - honoring the javadoc by putting a wait only after the 10th failed attempt to delete a file */ @Test public void dontWaitTooMuchIfCantDelete(){ java.io.File f = mock(java.io.File.class); when(f.isFile()).thenReturn(true); when(f.delete()).thenReturn(false); long start = currentTimeMillis(); Files.remove(f); long end = currentTimeMillis(); assertThat(end - start, lessThan(5000l)); } /** * Tests for {@link Files#removeFolder(java.io.File)} * * @throws Exception */ @Test public void removeFolder() throws Exception { assertFalse("'null' folders are not deleted.", Files.removeFolder(null)); assertFalse("Non existing folders are not deleted.", Files.removeFolder(new File( "/somethingThatDoesntExistsOnMostMachines-111111111111111111111111111111"))); java.io.File folder = new File(System.getProperty("java.io.tmpdir"), "wicket-test-folder"); Files.mkdirs(folder); assertTrue(folder.isDirectory()); File file = new File(folder, "child"); file.createNewFile(); assertTrue(file.exists()); assertTrue("Should be able to delete a folder.", Files.removeFolder(folder)); } /** * Tests for {@link Files#removeAsync(java.io.File, IFileCleaner)} * * @throws Exception */ @Test @Ignore // the test is unreliable on the CI server public void removeAsync() throws Exception { IFileCleaner fileCleaner = new FileCleaner(); assertFalse("'null' files are not deleted.", Files.removeAsync(null, fileCleaner)); File nonExistingFile = new File( "/somethingThatDoesntExistsOnMostMachines-111111111111111111111111111111"); assertTrue("Even non existing file are scheduled for deletion.", Files.removeFolderAsync(nonExistingFile, fileCleaner)); assertFalse(nonExistingFile.exists()); java.io.File file = getFile(); file.createNewFile(); assertTrue("The just created file should exist!", file.exists()); assertTrue(file.isFile()); assertTrue("The file is scheduled for deletion.", Files.removeAsync(file, fileCleaner)); // remove the reference to the file to be deleted // this way the FileCleaningTracker's ReferenceQueue will mark it as eligible for GC file = null; // give chance to the file cleaner to run and delete the folder System.gc(); boolean exists = true; for (int i = 0; i < 10; i++) { Thread.sleep(5); java.io.File newFileReference = getFile(); if (!newFileReference.exists()) { exists = false; break; } } assertFalse("The file no longer exists", exists); } /** * Tests for {@link Files#removeFolderAsync(java.io.File, IFileCleaner)} * * @throws Exception */ @Test @Ignore // the test is unreliable on the CI server public void removeFolderAsync() throws Exception { assertFalse("'null' folders are not deleted.", Files.removeFolderAsync(null, null)); IFileCleaner fileCleaner = new FileCleaner(); File nonExistingFolder = new File( "/somethingThatDoesntExistsOnMostMachines-111111111111111111111111111111"); assertTrue("Even non existing folders are scheduled for deletion.", Files.removeFolderAsync(nonExistingFolder, fileCleaner)); assertFalse(nonExistingFolder.exists()); java.io.File folder = getFolder(); Files.mkdirs(folder); assertTrue(folder.isDirectory()); File file = new File(folder, "child"); file.createNewFile(); assertTrue(file.exists()); assertTrue("The folder is scheduled for deletion.", Files.removeFolderAsync(folder, fileCleaner)); // remove the reference to the folder to be deleted // this way the FileCleaningTracker's ReferenceQueue will mark it as eligible for GC folder = null; // give chance to the file cleaner to run and delete the folder System.gc(); Thread.sleep(5); java.io.File newFolderReference = getFolder(); assertFalse("The folder still exists", newFolderReference.exists()); } /** * WICKET-4509 * * @throws Exception */ @Test public void fileWithWhitespace() throws Exception { URL url = new URL("file:/file%20with%20whitespace"); assertEquals( java.io.File.separator + "file with whitespace", Files.getLocalFileFromUrl(url).getPath()); } /** * @return a reference to a folder, without creating it ! */ private java.io.File getFolder() { File folder = new File(System.getProperty("java.io.tmpdir"), "wicket-7.x-test-folder"); return folder; } /** * @return a reference to a file, without creating it ! * @throws IOException */ private java.io.File getFile() throws IOException { return new java.io.File(System.getProperty("java.io.tmpdir"), "wicket-7.x-test-file"); } }